% Practica 1 - Apartado 2 - Caso 2 vectores tridimensionales

close all;
clear all;
clc;
format long;

a = 2;
b = rand;

% Senal continua:
%Ejemplo 1:
%x = -3:0.05:3;
%senal = sin(x) - cos(2.*x); % Senal de entrada
%senal_salida = 2.5*senal; % Combinacion lineal de la senal de entrada

%Ejemplo 2
%x = 1:0.005:3;
%senal = sin(sin(x).*x*10) + sin(tan(3.2./x));
%senal_salida = a*senal + b;

%Ejemplo 3 (learnwh)
%x1 = -5:0.005:0;
%x2 = 0.1:0.005:4;
%x=[x1 x2];
%senal = [x1.^2+cos(3*x1)./2+sin(x1.^2) sin(4*x2.^2)+(3*x2.^2)];
%senal_salida = a*senal + b;

%Ejemplo 4
%x= 0:0.005:3;
%senal = sin (x);
%senal_salida = a*senal + b;

%Ejemplo 5 
%x = 0:0.005:5;
%senal= sin(2.*x)-cos(3.*x);
%senal_salida = a*senal + b;

% Ejemplo 6
%x1 = -2:0.01:-1;
%x2 = -1:0.01:1;
%x3 = 1:0.01:2;
%x = [x1 x2 x3];
%senal = [x1.^2 + cos(2*x1) tan(x2.^2) exp(x3)];
%senal_salida = a*senal + b;      

%Ejemplo 7
%x1 = -3:0.01:0;
%x2 = 0:0.01:3;
%x = [x1 x2];
%senal = [(4*x1) (-3*x2.^2)];
%senal_salida = 2*senal;

%Ejemplo 8
x = -3*pi:0.005:3*pi;
senal = cos(3*x.^2) + sin(0.5*x);
senal_salida = a*senal + b;

v = maxlinlr(x); % velocidad de aprendizaje

ruido = senal;
for i = 1:length(x),
    ruido(i) = senal(i) + 0.05*rand;
end

PR2 = [min(x) max(x);min(x) max(x);min(x) max(x)];
S2 = 1;
ID2 = 0;
LR2 = v;
red2 = NEWLIN(PR2,S2,ID2,LR2);

% inicializacion aleatoria de los pesos:
for i = 1:3,
    peso(i,1) = rand;
end
red2.iw{1} = [peso(1,1) peso(2,1) peso(3,1)];
red2.trainParam.goal = 0.0001;
red2.trainParam.epochs = 500;
    
% Patrones:
for i = 1:(length(x)-3),
    p(1,i) = senal(i);
    p(2,i) = senal(i+1);
    p(3,i) = senal(i+2);
    s(i) = senal_salida(i+1);
end

% Entrenamiento de la red
[red2,TR,Y,E] = train(red2,p,s);
Salida = Y;
Error = E;
peso(1:3,:) = red2.iw{1,1};
w1 = peso(1);
w2 = peso(2);
w3 = peso(3);
bias = red2.b{1};
    
%LP.lr = v;    
%for i = 1:(length(x)-3),
%    patron = [senal(i) senal(i+1) senal(i+2)];
%    deseada(i) = senal_salida(i+1);
%    obtenida(i) = senal(i)*peso(1,i) + senal(i+1)*peso(2,i) + senal(i+2)*peso(3,i);
%    error(i) = deseada(i) - obtenida(i);
%    Error(i) = mse(error(i));
%    dw = learnwh(peso(:,i),patron,[],[],[],deseada(i),error(i),[],[],[],LP,[]);
%    w1 = peso(1,i);
%    w2 = peso(2,i);
%    w3 = peso(3,i);
%    peso(1,(i+1)) = w1 + dw(1);
%    peso(2,(i+1)) = w2 + dw(2);
%    peso(3,(i+1)) = w3 + dw(3);
%end
    
%for i = 1:(length(x) - 3),
%    Salida(i) = senal(i)*w1 + senal(i+1)*w2 + senal(i+2)*w3;
%end
    
for i = 1:(length(x) - 3),
    obtenida_ruido(i) = ruido(i)*w1 + ruido(i+1)*w2 + ruido(i+2)*w3 + bias;
end
    
% Representaciones Graficas
    
%figure(7);
%plot(senal,'r');
%hold on;
%plot(senal_salida,'b');
%hold off;
%legend('Senal de entrada','Senal de salida');

%figure(8);
%plot(Salida,'b');
%hold on
%plot(senal_salida,'r--');
%legend('Senal obtenida','Senal deseada');
%hold off;

%figure(9);
%plot(Error,'g');

%figure(10);
%plot(obtenida_ruido,'r');
%hold on;
%plot(Salida,'b--');
%legend('Obtenida con ruido','Senal de salida');
%hold off;

figure(5);
subplot(211);
plot(senal,'r');
hold on;
plot(senal_salida,'b');
hold off;
legend('Senal de entrada','Senal de salida');
grid;
subplot(212);
plot(Salida,'b');
hold on;
plot(senal_salida,'r--');
legend('Senal obtenida','Senal deseada');
hold off;
grid;
figure(6)
subplot(211);
plot(obtenida_ruido,'r');
hold on;
plot(Salida,'b--');
legend('Obtenida con ruido','Senal de salida');
hold off;
grid;
subplot(212);
plot(Error,'g');
grid; %Error devuelto por train
    